package lib

import (
	"encoding/json"
	"io/ioutil"
	"log"
	"net/http"
	"net/url"
)

var accessTokenURL = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=WhGsmv5uTul6WUVdqmQjAbv3&client_secret=owaOpOjMUVt3zXIweepNQPIpgEDxSeTt"

//accessTokenType 获取access_token的类型，只有expires_in和access_token有用，其他可以忽略
type accessTokenType struct {
	RefreshToken  string `json:"refresh_token"`
	ExpiresIn     string `json:"expires_in"` //使用时间，秒
	SessionKey    string `json:"session_key"`
	AccessToken   string `json:"access_token"` //正式用来使用的校验值
	Scope         string `json:"scope"`
	SessionSecret string `json:"session_secret"`
}

//AcceptResultWord 接收识别的文字信息
type AcceptResultWord struct {
	LogID          int64   `json:"log_id"`
	WordsResultNum int64   `json:"words_result_num"`
	WordsResult    []words `json:"words_result"`
}
type words struct {
	Words string
}

//getAccessToken 获取accessToken,内部的三个参数,一个月的有效期
//grant_type： 必须参数，固定为client_credentials
///client_id： 必须参数，应用的API Key
//client_secret： 必须参数，应用的Secret Key
//https://ai.baidu.com/docs#/Auth/top
func getAccessToken() (accessTokenType, error) {
	client := &http.Client{}
	req, err := http.NewRequest("GET", accessTokenURL, nil)
	if err != nil {
		return accessTokenType{}, err
	}
	resp, err := client.Do(req)
	if err != nil {
		return accessTokenType{}, err
	}
	defer resp.Body.Close()
	b, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return accessTokenType{}, err
	}

	accessToken := accessTokenType{}
	json.Unmarshal(b, &accessToken)
	return accessToken, nil
}

//baidubceAddress baidu API接口转换地址，access_token部分是上述get方法中获取的，如果到期了就再请求换一个
var baidubceAddress = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=24.78b5b7e8dc8e1552920ad6e9ca39d3ed.2592000.1577848805.282335-17903904"

//getImageWord 发送表单数据,返回word，需要一个query值和表单中放入image64数据，大小不能超过4M,具体返回和参数去参考api文档
//https://ai.baidu.com/docs#/OCR-API-GeneralBasic/top
func getImageWord(imageBase64 []string) (AcceptResultWord, error) {
	client := &http.Client{}

	res, err := client.PostForm(baidubceAddress, url.Values{
		"image": imageBase64,
	})
	if err != nil {
		return AcceptResultWord{}, err
	}
	defer res.Body.Close()
	resData := AcceptResultWord{}
	resdatabyte, err := ioutil.ReadAll(res.Body)
	if err != nil {
		return AcceptResultWord{}, err
	}
	if err := json.Unmarshal(resdatabyte, &resData); err != nil {
		return AcceptResultWord{}, err
	}
	log.Println(resData)
	return resData, nil
}

//BaiduAPIImageLoad 执行入口,输入包裹images base64格式的图片内容，输入API反馈类型数据和err
func BaiduAPIImageLoad(imageBase64 []string) (AcceptResultWord, error) {
	word, err := getImageWord(imageBase64)
	if err != nil {
		return AcceptResultWord{}, err
	}
	return word, nil
}
